/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vue;

import application.FicheMediaController;
import dao.MediaDAO;
import dao.MediaDAOAuteur;
import java.awt.Font;
import media.Media;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;

/**
 * Classe définissant un fiche média type qui sera etendue par les fiches
 * utilisée par l'application
 * @author Florian Minin & Khémon Beh
 */
public abstract class FicheMediaAbstract extends JFrame {

    public final static String BTN_MODIFIER = "Modifier";
    public final static String BTN_SAUVEGARDER = "Sauvegarder";
    protected Media media;
    protected static int idFicheMedia = 0;
    protected JLabel lblNomFichier;
    protected JLabel lblType;
    protected JLabel lblEmplacement;
    protected JLabel lblDescription;
    protected JLabel lblValNomFichier;
    protected JLabel lblValType;
    protected JLabel lblValEmplacement;
    protected JTextArea jtxtValDescription;
    protected JComboBox comboBoxNote;
    protected JButton btnModifier;
    protected JButton btnSauvegarder;
    protected JPanel pnlPrincipal;
    protected VueGestionAuteur vueGestion;

    public FicheMediaAbstract(Media _media) {
        media = _media;
        ++idFicheMedia;
    }

    /**
     * Initialises les composants communs a tout les médias
     */
    protected void initComponentsGenerique() {
        setResizable(false);
        Border loweredbevel = BorderFactory.createLoweredBevelBorder();

        setResizable(false);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setBounds(100, 100, 553, 539);
        pnlPrincipal = new JPanel();
        pnlPrincipal.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(pnlPrincipal);
        pnlPrincipal.setLayout(null);

        lblNomFichier = new JLabel("Nom du fichier");
        lblNomFichier.setFont(new Font("Lucida Grande", Font.BOLD, 13));
        lblNomFichier.setBounds(18, 18, 109, 16);
        pnlPrincipal.add(lblNomFichier);

        lblValNomFichier = new JLabel();
        lblValNomFichier.setBounds(16, 33, 503, 28);
        lblValNomFichier.setFont(new Font("Lucida Grande", Font.PLAIN, 13));
        pnlPrincipal.add(lblValNomFichier);

        lblType = new JLabel("Type");
        lblType.setFont(new Font("Lucida Grande", Font.BOLD, 13));
        lblType.setBounds(18, 61, 40, 16);
        pnlPrincipal.add(lblType);

        lblValType = new JLabel(media.getType());
        lblValType.setBounds(18, 80, 501, 16);
        pnlPrincipal.add(lblValType);

        lblEmplacement = new JLabel("Emplacement");
        lblEmplacement.setFont(new Font("Lucida Grande", Font.BOLD, 13));
        lblEmplacement.setBounds(18, 103, 116, 16);
        pnlPrincipal.add(lblEmplacement);

        lblValEmplacement = new JLabel();
        lblValEmplacement.setBounds(18, 119, 501, 16);
        lblValEmplacement.setFont(new Font("Lucida Grande", Font.PLAIN, 9));
        pnlPrincipal.add(lblValEmplacement);

        lblDescription = new JLabel("Description");
        lblDescription.setFont(new Font("Lucida Grande", Font.BOLD, 13));
        lblDescription.setBounds(18, 147, 116, 16);
        pnlPrincipal.add(lblDescription);

        jtxtValDescription = new JTextArea();
        jtxtValDescription.setWrapStyleWord(true);
        jtxtValDescription.setFont(new Font("Lucida Grande", Font.PLAIN, 13));
        jtxtValDescription.setBounds(18, 164, 501, 77);
        jtxtValDescription.setColumns(10);
        jtxtValDescription.setRows(4);
        jtxtValDescription.setBorder(loweredbevel);
        pnlPrincipal.add(jtxtValDescription);

        JLabel lblNote = new JLabel("Note");
        lblNote.setFont(new Font("Lucida Grande", Font.BOLD, 13));
        lblNote.setBounds(18, 249, 61, 16);
        pnlPrincipal.add(lblNote);

        comboBoxNote = new JComboBox();
        Integer[] valeurs = {0, 1, 2, 3, 4, 5};
        DefaultComboBoxModel modelComboBox = new DefaultComboBoxModel(valeurs);
        comboBoxNote.setModel(modelComboBox);
        comboBoxNote.setEnabled(false);
        comboBoxNote.setSelectedItem(media.getNote());
        comboBoxNote.setBounds(18, 263, 134, 28);
        comboBoxNote.setSelectedIndex(media.getNote());
        pnlPrincipal.add(comboBoxNote);

        btnModifier = new JButton("Modifier");
        btnModifier.setBounds(280, 482, 117, 29);
        pnlPrincipal.add(btnModifier);

        btnSauvegarder = new JButton("Sauvegarder");
        btnSauvegarder.setBounds(402, 482, 117, 29);
        pnlPrincipal.add(btnSauvegarder);

        btnModifier.setActionCommand(BTN_MODIFIER);
        btnSauvegarder.setActionCommand(BTN_SAUVEGARDER);
    }

    /**
     * Gère l'abonnement des composants
     * @param ctrl Controlleur des fiches médias
     */
    public abstract void abonnementComponents(FicheMediaController ctrl);

    /**
     * Bascule la fenêtre en mode modification
     */
    public void setToModeModification() {
        //Active les champs de description et de notation
        jtxtValDescription.setEnabled(true);
        comboBoxNote.setEnabled(true);
    }

    /**
     * Bascule la fenêtre en mode consultation
     */
    public void setToModeConsultation() {
        //Désactive les champs de description et de notation
        jtxtValDescription.setEnabled(false);
        comboBoxNote.setEnabled(false);
    }


    /**
     * Charge les données du média dans la fiche
     * @param media média associé a la fiche
     */
    public void chargerMedia(Media media){
        this.media = media;
        this.lblValNomFichier.setText(media.getNomFichier());
        this.jtxtValDescription.setText(media.getDescription());
        this.comboBoxNote.setSelectedIndex(media.getNote());
        this.lblValEmplacement.setText(media.getCheminSurDisque());
    }

    /**
     * Associe un dao a la fenêtre
     * @param dao
     */
    public abstract void associerDAO(MediaDAO dao);

    /**
     * Recupère le dao associé a la fenêtre
     * @return le dao
     */
    public abstract MediaDAO getDAO();

    /**
     * Enregistre les modification apportées au média
     */
    public abstract void saveModification();

    /**
     * Ouvre la fenêtre de gestion des auteurs
     * @param dao dao permettant de recupérer les auteurs d'un DAO
     */
    public abstract void ouvreGestionAuteur(MediaDAOAuteur dao);

    public Media getMedia(){
        return media;
    }
}
